#include "panic.h"
#include "monitor.h"
#include "common.c"

#define KBRD_INTRFC (short)0x64
 
/* keyboard interface bits */
#define KBRD_BIT_KDATA (short)0 /* keyboard data is in buffer (output buffer is empty) (bit 0) */
#define KBRD_BIT_UDATA (short)1 /* user data is in buffer (command buffer is empty) (bit 1) */
 
#define KBRD_IO (unsigned char)0x60 /* keyboard IO port */
#define KBRD_RESET (unsigned char)0xFE /* reset CPU command */
 
#define bit(n) (1<<(n)) /* Set bit n to 1 */
 
/* Check if bit n in flags is set */
#define check_flag(flags, n) ((flags) & bit(n))


void panic()
{
	printf("KERNEL PANIC!!!");

	unsigned char temp;
 
 	asm volatile ("CLI"); /* disable all interrupts */
 
	/* Clear all keyboard buffers (output and command buffers) */
	do
	{
		temp = inb(KBRD_INTRFC); /* empty user data */
		if (check_flag(temp, KBRD_BIT_KDATA) != 0)
			inb(KBRD_IO); /* empty keyboard data */
	} while (check_flag(temp, KBRD_BIT_UDATA) != 0);
 
	outb(KBRD_INTRFC, KBRD_RESET); /* pulse CPU reset line */
	asm volatile ("HLT"); /* if that didn't work, halt the CPU */
}
